1 什么是线程
在操作系统中,每个进程都有一个地址空间,而且默认有一个控制线程
进程是资源单位,线程是执行单位
进程只是用来把资源集中到一起,线程是CPU上的执行单位
2 线程的开销小
如果我们的软件是一个工厂,该工厂有多条流水线,流水线工作需要电源,电源只有一个即cpu(单核cpu)
一个车间就是一个进程,一个车间至少一条流水线(一个进程至少一个线程)
创建一个进程,就是创建一个车间(申请空间,在该空间内建至少一条流水线)
而建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小
进程之间是竞争关系,线程之间是协作关系:
http://www.cnblogs.com/linhaifeng/articles/7430082.html
3 为什么用多线程
- 多线程共享一个进程的地址空间
- 线程比进程更轻量级 更容易创建 可撤销,创建线程比创建进程快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用
- 在CPU系统中,为了利用多核,可以开启多个线程,比开进程开销的小
不同进程之间的关系是竞争关系,抢占CPU,同一进程内的线程是合作关系,一个线程可以访问另一个线程的内存。
多线程的设计时有难度的。
1. 父进程有多个线程,那么开启的子线程是否需要同样多的线程
如果是,那么附近中某个线程被阻塞,那么copy到子进程后,copy版的线程也要被阻塞吗,想一想nginx的多线程模式接收用户连接。
2. 在同一个进程中,如果一个线程关闭了问题,而另外一个线程正准备往该文件内写内容呢?
如果一个线程注意到没有内存了,并开始分配更多的内存,在工作一半时,发生线程切换,新的线程也发现内存不够用了,又开始分配更多的内存,这样内存就被分配了多次,这些问题都是多线程编程的典型问题,需要仔细思考和设计。
4 threading模块
multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性
4.1 开启线程的两种昂方式
方式一:
方式二:
|
|
5 在一个进程下开启多个线程与在一个进程下开启多个子进程的区别
|
|
结果:
hello
主线程/主进程
主线程/主进程
hello